Problemy s detekci Active a DeActive

Otázka od: Ing. Jiri SOKOL

9. 9. 2002 14:53

Ahoj,
mam aplikaci, ktera ma byt OnTop. Jenze, kdyz nebude aktivni, nesmi byt
OnTop, protoze jinak pres ni nebude nic videt.
Osetroval jsem to udalostmi application.onactive/deactive, zkousel jsem to i
pres form1.onactive/deactive
Kdyz totiz v udalosti DeActive provedu zmenu okna z OnTop na NoTop, tak musim
jeste tohle okno poslat dopozadi, jinak jako by zustava porad OnTop.
No a pri techle operacich dojde k tomu, ze se vola udalost OnActive. Pozorny
citatel uz ted tusi co nasleduje. Ano, dojde k tomu, ze je okno zase nastaveno
na OnTop.
OK, osetril jsem OnActive a jsem schopen poznat, jestli se do nej dostanu po
provedeni
NoTop. Problem jeste horsi, protoze pak uz (kdyz se uzivatel skutecne vrati do
me aplikace)
udalost OnActive neprobehne.
Ach jo, ... co s tim?

Zkousel jsem to i s pomoci odchytavani zprav, ale vysledek je uplne stejny.
Napadlo me, ze
by stalo za to se "napichnout" na udalost, ktera zpusobi, ze pruh aplikace je
bud modry nebo
sedy. To je presne to, co chci akorat nevim jak to udelat.

Any idea?

Diky Jirka.

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky programator

______________________________________________________________________
Reklama:
Nejenom anglicko-cesky slovnik: http://slovnik.seznam.cz

Odpovedá: Lebeda David

10. 9. 2002 12:47

> mam aplikaci, ktera ma byt OnTop. Jenze, kdyz nebude aktivni, nesmi
> byt OnTop, protoze jinak pres ni nebude nic videt.

Tomuhle nejak nerozumim. Kdyz je aplikace aktivni, tak je v popredi, no a kdyz
se
prepnes do jine, stane se ta Tvoje neaktivni a podle potreby bude prekryta. Jak
se
tedy pozadovane chovani lisi od bezneho chovani kazde aplikace?

David Lebeda

Odpovedá: Ing. Jiri SOKOL

10. 9. 2002 21:59

> > mam aplikaci, ktera ma byt OnTop. Jenze, kdyz nebude aktivni, nesmi
> > byt OnTop, protoze jinak pres ni nebude nic videt.
>
> Tomuhle nejak nerozumim. Kdyz je aplikace aktivni, tak je v popredi, no a
kdyz se
> prepnes do jine, stane se ta Tvoje neaktivni a podle potreby bude prekryta.
Jak se
> tedy pozadovane chovani lisi od bezneho chovani kazde aplikace?
>
> David Lebeda

Aplikaci pomoci SetWindowPos(Form1.Handle,HWND_TopMost,0,0,0,0,swp_NoSize or
swp_NoMove);
nastavim, aby byla OnTop. Jenze kdyz neosetrim DeActive, aplikace zustane
OnTop, i kdyz
bude deactivovana a nic pres ni nebude videt.
Jenze ono nestaci osetrit deaktivaci pomoci:
SetWinPos(Form1.Handle,HWND_NoTopMost,0,0,0,0,swp_NoSize or swp_NoMove);
ale jeste ji musim poslat dopozadi (delam to pomoci Form1.SendToBack; - mozna
je chyba tady)
a to zpusobi vyvolani udalosti Activate a to je ten hlavni problem.
Pak, i kdyz se aplikace skutecne stane aktivni, uz k udalosti Active nedojde.
Uff, blbe se to vysvetluje spis asi pomuze copy kodu:
Tak jsem ho prave dodelal a z napovedy k SetWindowPos() jsem vycetl bajecnou
vec - HWND_Bottom
coz dela to, co potrebuji (kdyz z OnTop jdu na NoTop, tak jeste potrebuju
poslat okno do pozadi)
Jestli jste s tim nekdo meli nekdy nejake problemy, tak tady je f-cni kod:

unit Unit1;
interface
uses
  Windows, Forms, SysUtils, Classes, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    procedure AppActivate(Sender: TObject);
    procedure AppDeactivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.AppActivate(Sender: TObject);
begin
  SetWindowPos(Application.Handle,HWND_TOPMOST,0,0,0,0,swp_NoSize or
               swp_NoMove or swp_NoActivate);
end;

procedure TForm1.AppDeactivate(Sender: TObject);
begin
  SetWindowPos(Application.Handle,HWND_NoTOPMOST,0,0,0,0,swp_NoSize or
               swp_NoMove or swp_NoActivate);
  SetWindowPos(Application.Handle,HWND_Bottom,0,0,0,0,swp_NoSize or
               swp_NoMove or swp_NoActivate);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnDeactivate:=AppDeactivate;
  Application.OnActivate:=AppActivate;
end;

end.

Diky za cas, ktery jste venovali reseni meho problemu. (nemyslim to ironicky!)
Jirka

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator

______________________________________________________________________
Reklama:
Poctenicko pro kazdy den: http://www.novinky.cz